package org.patterns.creational.prototype.deepclone;

import java.io.*;

public class WeeklyLog implements Serializable {
    // 定义一个类级别的私有变量，用于存储名称信息
    private String name;
    // 定义一个类级别的私有变量，用于存储日期信息
    private String date;
    // 定义一个类级别的私有变量，用于存储内容信息
    private String content;
    // 定义一个类级别的私有变量，用于存储附件信息
    private Attachment attachment;

    /**
     * 获取名称信息
     * @return 名称字符串
     */
    public String getName() {
        return (this.name);
    }

    /**
     * 设置名称信息
     * @param name 名称字符串
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取日期信息
     * @return 日期字符串
     */
    public String getDate() {
        return (this.date);
    }

    /**
     * 设置日期信息
     * @param date 日期字符串
     */
    public void setDate(String date) {
        this.date = date;
    }

    /**
     * 获取内容信息
     * @return 内容字符串
     */
    public String getContent() {
        return (this.content);
    }

    /**
     * 设置内容信息
     * @param content 内容字符串
     */
    public void setContent(String content) {
        this.content = content;
    }

    /**
     * 获取附件信息
     * @return 附件对象
     */
    public Attachment getAttachment() {
        return (this.attachment);
    }

    /**
     * 设置附件信息
     * @param attachment 附件对象
     */
    public void setAttachment(Attachment attachment) {
        this.attachment = attachment;
    }


    /**
     * 使用序列化技术实现深克隆
     * @return 克隆出的新对象
     * @throws IOException 当序列化过程中发生I/O错误时抛出
     * @throws ClassNotFoundException 当反序列化过程中找不到对应的类时抛出
     * @throws OptionalDataException 当反序列化过程中遇到不符合预期的数据时抛出
     */
    public WeeklyLog deepClone() throws IOException, ClassNotFoundException, OptionalDataException {
        // 将对象写入流中
        ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOutputStream);
        objectOutputStream.writeObject(this);

        // 将对象从流中取出
        ByteArrayInputStream byteInputStream = new ByteArrayInputStream(byteOutputStream.toByteArray());
        ObjectInputStream objectInputStream = new ObjectInputStream(byteInputStream);
        return (WeeklyLog) objectInputStream.readObject();
    }
}